package org.jf.tool.fx.jftoolfx.util;

import org.quartz.CronExpression;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author jifeng_zhang
 * @date 2025/10/10 下午3:57
 */
public class CronUtil {

    /**
     * 获取Cron表达式最近N次执行时间
     *
     * @param cronExpression Cron表达式
     * @param count          需要获取的执行次数
     * @return 执行时间列表
     */
    public static List<Date> getNextExecutionTimes(String cronExpression, int count) {
        return getNextExecutionTimes(cronExpression, count, new Date());
    }

    /**
     * 获取Cron表达式从指定时间开始的最近N次执行时间
     *
     * @param cronExpression Cron表达式
     * @param count          需要获取的执行次数
     * @param afterTime      起始时间
     * @return 执行时间列表
     */
    public static List<Date> getNextExecutionTimes(String cronExpression, int count, Date afterTime) {
        List<Date> executionTimes = new ArrayList<>();

        try {
            CronExpression cron = new CronExpression(cronExpression);
            Date currentTime = afterTime;

            for (int i = 0; i < count; i++) {
                Date nextTime = cron.getNextValidTimeAfter(currentTime);
                if (nextTime == null) {
                    break; // 如果没有下一次执行时间，退出循环
                }
                executionTimes.add(nextTime);
                currentTime = nextTime;
            }

        } catch (ParseException e) {
            throw new IllegalArgumentException("无效的Cron表达式: " + cronExpression, e);
        }

        return executionTimes;
    }

    /**
     * 格式化输出时间列表
     *
     * @param dates   时间列表
     * @param pattern 日期格式模式
     * @return 格式化后的时间字符串列表
     */
    public static List<String> formatDates(List<Date> dates, String pattern) {
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        List<String> formattedDates = new ArrayList<>();
        for (Date date : dates) {
            formattedDates.add(sdf.format(date));
        }
        return formattedDates;
    }
}
